package com.java.multipledatasource.thread;

/**
 * @author hu
 * @version 1.0
 * @date 2021/1/16 0016 上午 9:15
 * @description
 */
public class DCL {

    private static  volatile DCL dcl;

    private DCL() {

    }

    public static DCL getDclSingleton() {

        if (dcl == null) {
            synchronized (DCL.class) {
                if (dcl == null) {
                    /**
                     * dcl = new DCL();
                     *  在 jvm中分为三步
                     *  第一步 申请内存 (成员变量都是默认值 引用类型是 null 数据类型是 0)
                     *  第二步 对象成员变量赋值
                     *  第三步 将内存地址 赋给 dcl
                     *（ 第二步 第三步 可能会发生指令重排序 ）
                     *  synchronized （） 锁对象发生改变 并发下会出现问题 (用final修饰) final Object obj = new Object()
                     */
                    dcl = new DCL();
                }
            }
        }

        return dcl;
    }
}
